﻿using Interface.DAO;
using JMI_Nucleo.Classe;
using JMI_Nucleo.Enumerador;
using JMI_Nucleo.JMIProvider;
using OR;
using OR.Enumerador;
using System;
using System.Data;
using System.Data.Common;

namespace Dao
{
    public class PessoaDao : IPessoaDao<mPessoa>
    {
        private mPessoa infoPessoa;

        public PessoaDao()
        {
        }

        #region Comando SQL
        const string cmdInsertSQL = @"INSERT INTO cadastro.pessoa(indice, empresa, nome, apelido, cnpj, cpf, ie, rg, 
                                      nascimento, tipo, profissao, estadocivil, pai, mae, sexo)
                                      VALUES (@indice, @empresa, @nome, @apelido, @cnpj, @cpf, @ie, @rg, 
                                      @nascimento, @tipo, @profissao, @estadocivil, @pai, @mae, @sexo)";

        const string cmdUpdateSQL = @"UPDATE cadastro.pessoa SET nome=@nome, apelido=@apelido, cnpj=@cnpj, cpf=@cpf, 
                                      ie=@ie, rg=@rg, nascimento=@nascimento, tipo=@tipo, profissao=@profissao, 
                                      estadocivil=@estadocivil, pai=@pai, mae=@mae, sexo=@sexo ";

        const string cmdDeleteSQL = @"DELETE FROM cadastro.pessoa ";

        const string cmdSelectSQL = @"SELECT indice, empresa, nome, apelido, cnpj, cpf, ie, rg, nascimento, 
                                      tipo, profissao, estadocivil, pai, mae, sexo
                                      FROM cadastro.pessoa ";

        #endregion
  
        #region Metodos
        bool IPessoaDao<mPessoa>.Inserir(mPessoa infoPessoa)
        {
            bool sucesso = false;
            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = cmdInsertSQL;
                GeraParametro(ref _cmd, infoPessoa, 1);
                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IPessoaDao<mPessoa>.Inserir(mPessoa infoPessoa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IPessoaDao<mPessoa>.Alterar(mPessoa infoPessoa, int Indice, short Empresa)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL = String.Empty;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdUpdateSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;
                
                GeraParametro(ref _cmd, infoPessoa, 2);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = infoPessoa.Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = infoPessoa.Empresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IPessoaDao<mPessoa>.Alterar(mPessoa infoPessoa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IPessoaDao<mPessoa>.Excluir(int Indice, short Empresa)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdDeleteSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = infoPessoa.Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = infoPessoa.Empresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);       
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IPessoaDao<mPessoa>.Excluir(int Indice)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }

        mPessoa IPessoaDao<mPessoa>.GetPessoa(int Indice, short Empresa)
        {
            infoPessoa = new mPessoa();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                if (rd.Read())
                    infoPessoa = GetRdPessoa(rd);

                return infoPessoa;
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "mPessoa IPessoaDao<mPessoa>.GetPessoa(int Entidade, int Indice)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return infoPessoa;
        }        
        #endregion

        #region Metodos privados
        private mPessoa GetRdPessoa(DbDataReader rd)
        {
            infoPessoa = new mPessoa();

            infoPessoa.Indice = Convert.ToInt32(rd["indice"]);
            infoPessoa.Empresa = Convert.ToInt16(rd["empresa"]);
            infoPessoa.Nome = rd["nome"].ToString();
            infoPessoa.Apelido = rd["apelido"].ToString();
            infoPessoa.CNPJ = rd["cnpj"].ToString();
            infoPessoa.CPF = rd["cpf"].ToString();
            infoPessoa.IE = rd["ie"].ToString();
            infoPessoa.RG = rd["rg"].ToString();
            infoPessoa.Nascimento = Convert.ToDateTime(rd["nascimento"]);
            infoPessoa.Tipo = (eTipoPessoa)Convert.ToInt32(rd["tipo"]);
            infoPessoa.Profissao = rd["profissao"].ToString();
            infoPessoa.EstadoCivil = (eEstadoCivil)Convert.ToInt32(rd["estadocivil"]);
            infoPessoa.Pai = rd["pai"].ToString();
            infoPessoa.Mae = rd["mae"].ToString();
            infoPessoa.Sexo = (eGenero)Convert.ToInt32(rd["sexo"]);

            return infoPessoa;
        }
        private void GeraParametro(ref DbCommand _cmd, mPessoa infoPessoa, byte Acao)
        {
            _cmd.Parameters.Clear();
            JMIUtil jmiUtil = new JMIUtil();

            if (Acao == 1)
            {
                UtilBD.AdicionaParametro(ref _cmd, "@indice", infoPessoa.Indice);
                UtilBD.AdicionaParametro(ref _cmd, "@empresa", infoPessoa.Empresa);
            }
            UtilBD.AdicionaParametro(ref _cmd, "@nome", infoPessoa.Nome);
            UtilBD.AdicionaParametro(ref _cmd, "@apelido", infoPessoa.Apelido);
            UtilBD.AdicionaParametro(ref _cmd, "@cnpj", jmiUtil.RemoveMascara(infoPessoa.CNPJ));
            UtilBD.AdicionaParametro(ref _cmd, "@cpf", jmiUtil.RemoveMascara(infoPessoa.CPF));
            UtilBD.AdicionaParametro(ref _cmd, "@ie", infoPessoa.IE);
            UtilBD.AdicionaParametro(ref _cmd, "@rg", infoPessoa.RG);
            UtilBD.AdicionaParametro(ref _cmd, "@nascimento", infoPessoa.Nascimento);
            UtilBD.AdicionaParametro(ref _cmd, "@tipo", (int)Enum.Parse(typeof(eTipoPessoa),infoPessoa.Tipo.ToString()));
            UtilBD.AdicionaParametro(ref _cmd, "@profissao", infoPessoa.Profissao);
            UtilBD.AdicionaParametro(ref _cmd, "@estadocivil", (int)Enum.Parse(typeof(eEstadoCivil),infoPessoa.EstadoCivil.ToString()));
            UtilBD.AdicionaParametro(ref _cmd, "@pai", infoPessoa.Pai);
            UtilBD.AdicionaParametro(ref _cmd, "@mae", infoPessoa.Mae);
            UtilBD.AdicionaParametro(ref _cmd, "@sexo", (int)Enum.Parse(typeof(eGenero),infoPessoa.Sexo.ToString()));
        }
        #endregion
    }
}
